/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.bpel.model;

import org.eclipse.emf.common.util.EList;

import org.eclipse.emf.ecore.EObject;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Writers</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.bpel.model.Writers#getPoss <em>Poss</em>}</li>
 *   <li>{@link org.eclipse.bpel.model.Writers#getInv <em>Inv</em>}</li>
 *   <li>{@link org.eclipse.bpel.model.Writers#getDis <em>Dis</em>}</li>
 *   <li>{@link org.eclipse.bpel.model.Writers#isMbd <em>Mbd</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.bpel.model.ModelPackage#getWriters()
 * @model
 * @generated
 */
public interface Writers extends EObject {
	/**
	 * Returns the value of the '<em><b>Poss</b></em>' reference list.
	 * The list contents are of type {@link org.eclipse.bpel.model.Activity}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Poss</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Poss</em>' reference list.
	 * @see org.eclipse.bpel.model.ModelPackage#getWriters_Poss()
	 * @model
	 * @generated
	 */
	EList<Activity> getPoss();

	/**
	 * Returns the value of the '<em><b>Inv</b></em>' reference list.
	 * The list contents are of type {@link org.eclipse.bpel.model.Activity}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Inv</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Inv</em>' reference list.
	 * @see org.eclipse.bpel.model.ModelPackage#getWriters_Inv()
	 * @model
	 * @generated
	 */
	EList<Activity> getInv();

	/**
	 * Returns the value of the '<em><b>Dis</b></em>' reference list.
	 * The list contents are of type {@link org.eclipse.bpel.model.Activity}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Dis</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Dis</em>' reference list.
	 * @see org.eclipse.bpel.model.ModelPackage#getWriters_Dis()
	 * @model
	 * @generated
	 */
	EList<Activity> getDis();

	/**
	 * Returns the value of the '<em><b>Mbd</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Mbd</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Mbd</em>' attribute.
	 * @see #setMbd(boolean)
	 * @see org.eclipse.bpel.model.ModelPackage#getWriters_Mbd()
	 * @model
	 * @generated
	 */
	boolean isMbd();

	/**
	 * Sets the value of the '{@link org.eclipse.bpel.model.Writers#isMbd <em>Mbd</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Mbd</em>' attribute.
	 * @see #isMbd()
	 * @generated
	 */
	void setMbd(boolean value);

	/**
	 * This method is part of the Data Flow Analysis algorithm. Bad architectural
	 * style to merge this in here. 
	 * 
	 * Duplication purging. Through the use of 
	 * multiple outgoing links from the same writer in a flow activity, 
	 * it is possible to have a writer that is in more than one set of writes.
	 * Writers which are in more than one set are called duplicates. This
	 * method purges duplicates, so that the poss, dis and inv sets are
	 * disjunct sets.
	 * 
	 * The strategie is inv > dis > poss. That means writers in inv are
	 * purged from dis and poss. Writers in dis are purged from poss.
	 * 
	 * (Page 59, Alg.5)
	 */
	void purgeDuplicatesOr();

	void dump(String name, VariableElement ve, boolean pre);
	
//	void dump(Activity activity, VariableElement ve, boolean pre);

//	void dump(Process element, VariableElement variableElement, boolean pre);
	
	boolean equals(Writers other);

} // Writers
